//+------------------------------------------------------------------+
//|                                                       CPanel.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

// Задаём константу количества параметров таблицы панели
#define INFO_PANEL_SIZE 13

// Определение глобальных переменных
bool     is_open           = false;          // наличие открытой позиции

// Определение параметров панели
string   p_symbol          = "";             // отображаемый в панеле символ
long     p_magic           = 0;              // magicNumber
string   p_comment         = "";             // Комментарий к позиции
double   p_swap            = 0;              // Своп
double   p_commission      = 0;              // Комиссия
double   p_price_open      = 0;              // Цена открытия позиции
double   p_price_curr      = 0;              // Текущая цена 
double   p_profit          = 0;              // Профит
double   p_volume          = 0;              // Объём позиции 
double   p_price_TP        = 0;              // Уровень TP  
double   p_price_SL        = 0;              // Уровень SL
long     p_id              = 0;              // ID позиции  
ENUM_POSITION_TYPE p_side  = WRONG_VALUE;    // Тип позиции


// Определяем массив имен объектов, отражающих свойства позиции
string prop_names[INFO_PANEL_SIZE] = 
{
   "name_symbol",
   "name_magic",
   "name_comment",
   "name_swap",
   "name_commission",
   "name_price_open",
   "name_price_curr",
   "name_profit",
   "name_volume",
   "name_price_TP", 
   "name_price_SL",
   "name_id"
};

// Определяем массив значений
string prop_values[INFO_PANEL_SIZE] = 
{
   "value_symbol",
   "value_magic",
   "value_comment",
   "value_swap",
   "value_commission",
   "value_price_open",
   "value_price_curr",
   "value_profit",
   "value_volume",
   "value_price_TP", 
   "value_price_SL",
   "value_id"
};

// Функция создания графического объекта 
void ShowEdit(
   long              chart_id,         // идентификатор графика
   int               sub_window,       // индекс окна  
   string            name,             // имя объекта  
   string            text,             // текст объекта 
   ENUM_BASE_CORNER  corner,           // угол наклона объекта
   string            font_name,        // шрифт текста 
   int               font_size,        // размер шрифта 
   color             font_color,       // шрифт текста 
   int               x_size,           // координата ширины
   int               y_size,           // координата высоты 
   int               x_distance,       // координата ширины содержимого ячейки
   int               y_distance,       // координата высоты содержимого ячейки
   long              z_index,          // приоритет/очерёдность отображения
   color             bg_color,         // цвет фона   
   bool              read_only         // тип перетаскивания объекта
)
{
   bool obj = ObjectCreate(chart_id, name, OBJ_EDIT, sub_window, 0, 0);
   
   if(obj)
   {
      ObjectSetString(chart_id, name, OBJPROP_TEXT, text);              // определяем свойства объекта
      ObjectSetInteger(chart_id, name, OBJPROP_CORNER, corner);         // определяем угол наклона объекта
      ObjectSetString(chart_id, name, OBJPROP_FONT, font_name);         // определяем шрифт объекта
      ObjectSetInteger(chart_id, name, OBJPROP_FONTSIZE, font_size);    // определяем размер шрифта
      ObjectSetInteger(chart_id, name, OBJPROP_COLOR, font_color);      // определяем цвет шрифта
      ObjectSetInteger(chart_id, name, OBJPROP_BGCOLOR, bg_color);      // определяем цвет фона
      ObjectSetInteger(chart_id, name, OBJPROP_XSIZE, x_size);
      ObjectSetInteger(chart_id, name, OBJPROP_YSIZE, y_size);  
      ObjectSetInteger(chart_id, name, OBJPROP_XDISTANCE, x_distance);  
      ObjectSetInteger(chart_id, name, OBJPROP_YDISTANCE, y_distance);
      ObjectSetInteger(chart_id, name, OBJPROP_SELECTABLE, false);      // запрет перетаскивания сожержимого графического объекта  
      ObjectSetInteger(chart_id, name, OBJPROP_ZORDER, z_index);
      ObjectSetInteger(chart_id, name, OBJPROP_ALIGN, ALIGN_RIGHT);     // задаём выравнивание
      ObjectSetString(chart_id, name, OBJPROP_TOOLTIP, "\n");           // запрет на всплывающие подсказки     
   }
}

// Функция отображения меток
void ShowLabel(
   long              chart_id,         // идентификатор графика
   int               sub_window,       // индекс окна  
   string            name,             // имя объекта   
   string            text,             // текст объекта 
   ENUM_ANCHOR_POINT anchor,           // угол привязки метки  
   ENUM_BASE_CORNER  corner,           // угол привязки графика
   string            font_name,        // шрифт текста 
   int               font_size,        // размер шрифта 
   color             font_color,       // цвет метки 
   int               x_distance,       // х-координата метки
   int               y_distance,       // у-координата метки
   long              z_index           // приоритет отображения
)
{
   bool obj = ObjectCreate(chart_id, name, OBJ_LABEL, sub_window, 0, 0);
   
   if(obj)
   {
      ObjectSetString(chart_id, name, OBJPROP_TEXT, text);              // определяем текст метки
      ObjectSetString(chart_id, name, OBJPROP_FONT, font_name);         // определяем шрифт
      ObjectSetInteger(chart_id, name, OBJPROP_FONTSIZE, font_size);    // определяем размер шрифта
      ObjectSetInteger(chart_id, name, OBJPROP_COLOR, font_color);      // определяем цвет шрифта
      ObjectSetInteger(chart_id, name, OBJPROP_ANCHOR, anchor);         // определяем угол привязки
      ObjectSetInteger(chart_id, name, OBJPROP_CORNER, corner);         // определяем угол привязки
      ObjectSetInteger(chart_id, name, OBJPROP_XDISTANCE, x_distance);  
      ObjectSetInteger(chart_id, name, OBJPROP_YDISTANCE, y_distance); 
      ObjectSetInteger(chart_id, name, OBJPROP_ZORDER, z_index);
      ObjectSetInteger(chart_id, name, OBJPROP_SELECTABLE, false);      // запрет перетаскивания сожержимого графического объекта
      ObjectSetString(chart_id, name, OBJPROP_TOOLTIP, "\n");           // запрет на всплывающие подсказки     
   }
}


// Функция отображения свойств объекта
void ShowProperties()
{
   // Проверяем наличие открытой позиции
   is_open = PositionSelect(_Symbol);
   
   if(is_open)
   {
      p_symbol       = PositionGetString(POSITION_SYMBOL);
      p_comment      = PositionGetString(POSITION_COMMENT);
      p_magic        = PositionGetInteger(POSITION_MAGIC);
      p_price_open   = PositionGetDouble(POSITION_PRICE_OPEN);
      p_price_curr   = PositionGetDouble(POSITION_PRICE_CURRENT);
      p_price_SL     = PositionGetDouble(POSITION_SL); 
      p_price_TP     = PositionGetDouble(POSITION_TP);
      p_side         = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // Приведение к типу ENUM_POSITION_TYPE
      p_volume       = PositionGetDouble(POSITION_VOLUME);
      p_commission   = PositionGetDouble(POSITION_COMMISSION);
      p_swap         = PositionGetDouble(POSITION_SWAP); 
      p_profit       = PositionGetDouble(POSITION_PROFIT);
      p_id           = PositionGetInteger(POSITION_IDENTIFIER);
   }
   else ClearProperties(); // Сбрасываем значения свойств
   ShowPanel();            // Отображаем панель
}

// Функция сброса значений свойств графического объекта
void ClearProperties()
{
   p_symbol          = "";
   p_magic           = 0;
   p_comment         = "";
   p_swap            = 0;
   p_commission      = 0;
   p_price_open      = 0;
   p_price_curr      = 0;
   p_profit          = 0;
   p_volume          = 0; 
   p_price_TP        = 0;  
   p_price_SL        = 0;
   p_id              = 0;  
   p_side            = WRONG_VALUE;
}

// Функция отрисовки панели
void ShowPanel()
{
   int y_bg                   = 18;                   // координата по вертикале для заголовка
   int y_property             = 32;                   // координата по вертикале для свойства
   int line_height            = 12;                   // высота строки
   
   int font_size              = 10;                    // размер шрифта
   string font_name           = "Calibri";            // шрифт
   color font_color           = clrWhite;             // цвет шрифта
   
   ENUM_ANCHOR_POINT anchor   = ANCHOR_RIGHT_UPPER;   // установка точки привязки - правый верхний угол
   ENUM_BASE_CORNER corner    = CORNER_RIGHT_UPPER;   // установка начала координат
   
   int x_first_column         = 120;                  // горизонтальный отступ для первой колонки
   int x_second_column        = 10;                   // горизонтальный отступ для второй колонки
   
   // Массив для получения координат
   int y_prop_array[INFO_PANEL_SIZE] = {0};
   
   for(int i = 0; i < INFO_PANEL_SIZE; i++)
   {
      if(i == 0 ) y_prop_array[i] = y_property;                // построение начальной точки
      else y_prop_array[i] = y_property + line_height * i;     // построение последующих точек
   }
   
   // Запуск отрисовки панели
   ShowEdit(0, 0, "CPanelInfo", "",                         corner, font_name, font_size, font_color, 230, 190, 231, y_bg, 0, C'15,15,15', true);
   // Запуск отрисовки заголовка панели
   ShowEdit(0, 0, "CPanelHeader", "POSITION PRORPERTIES",   corner, font_name, 8, font_color, 230, 14, 231, y_bg, 1, clrBlue, true);
   
   // Запуск отрисовки меток
   ShowLabel(0, 0, prop_names[0], "Symbol: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[0], 2);
   ShowLabel(0, 0, prop_values[0], GetValue(0), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[0], 2);
   
   ShowLabel(0, 0, prop_names[1], "Magic number: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[1], 2);
   ShowLabel(0, 0, prop_values[1], GetValue(1), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[1], 2);
   
   ShowLabel(0, 0, prop_names[2], "Comment: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[2], 2);
   ShowLabel(0, 0, prop_values[2], GetValue(2), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[2], 2);
   
   ShowLabel(0, 0, prop_names[3], "Swap: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[3], 2);
   ShowLabel(0, 0, prop_values[3], GetValue(3), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[3], 2);
   
   ShowLabel(0, 0, prop_names[4], "Comission: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[4], 2);
   ShowLabel(0, 0, prop_values[4], GetValue(4), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[4], 2);
   
   ShowLabel(0, 0, prop_names[5], "Price: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[5], 2);
   ShowLabel(0, 0, prop_values[5], GetValue(5), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[5], 2);
   
   ShowLabel(0, 0, prop_names[6], "Current: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[6], 2);
   ShowLabel(0, 0, prop_values[6], GetValue(6), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[6], 2);
   
   ShowLabel(0, 0, prop_names[7], "Profit: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[7], 2);
   ShowLabel(0, 0, prop_values[7], GetValue(7), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[7], 2);
   
   ShowLabel(0, 0, prop_names[8], "Volume: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[8], 2);
   ShowLabel(0, 0, prop_values[8], GetValue(8), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[8], 2);
   
   ShowLabel(0, 0, prop_names[9], "SL: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[9], 2);
   ShowLabel(0, 0, prop_values[9], GetValue(9), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[9], 2);
   
   ShowLabel(0, 0, prop_names[10], "TP: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[10], 2);
   ShowLabel(0, 0, prop_values[10], GetValue(10), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[10], 2);
   
   ShowLabel(0, 0, prop_names[11], "ID: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[11], 2);
   ShowLabel(0, 0, prop_values[11], GetValue(11), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[11], 2);
   
   ShowLabel(0, 0, prop_names[12], "ORDER_TYPE: ", anchor, corner, font_name, font_size, font_color, x_first_column, y_prop_array[12], 2);
   ShowLabel(0, 0, prop_values[12], GetValue(12), anchor, corner, font_name, font_size, font_color, x_second_column, y_prop_array[12], 2);
   
   // Вызов функции обновления графика
   ChartRedraw();
}

// Функция получения значения метки
string GetValue(int arr_index)
{
   string empty = "-";
   
   if(is_open)
   {
      switch(arr_index)
      {
         case 0: return(p_symbol); break;
         case 1: return(IntegerToString(p_magic)); break;
         case 2: return(p_comment != "" ? p_comment : empty); break;
         case 3: return(DoubleToString(p_swap, 2)); break;
         case 4: return(DoubleToString(p_commission, 2)); break;
         case 5: return(DoubleToString(p_price_open, _Digits)); break;
         case 6: return(DoubleToString(p_price_curr, _Digits)); break;
         case 7: return(DoubleToString(p_profit, 2)); break;
         case 8: return(DoubleToString(p_volume, 2)); break;
         case 9: return(p_price_SL != 0 ? DoubleToString(p_price_TP, _Digits) : empty); break;
         case 10: return(p_price_SL != 0 ? DoubleToString(p_price_SL, _Digits) : empty); break;
         case 11: return(IntegerToString(p_id)); break;
         case 12: return(OrderType2Str(p_side)); break;
         
         default: return(empty);
      }
   }
   
   return(empty);
}

// Функция приведения к string типа ENUM_POSITION_TYPE
string OrderType2Str(ENUM_POSITION_TYPE atype)
{
   string str = "";
   
   if(atype == POSITION_TYPE_BUY) str = "BUY";
   else if(atype == POSITION_TYPE_SELL) str = "SELL";
   else str = "wrong value";
   return(str);
}

// Функция удаления панели
void DestroyPanel()
{
   DestroyObject("CPanelInfo");
   DestroyObject("CPanelHeader");
   
   for(int i = 0; i < INFO_PANEL_SIZE; i++)
   {
      DestroyObject(prop_names[i]);
      DestroyObject(prop_values[i]);
   }
   
   // Вызов функции обновления графика
   ChartRedraw();
}

void DestroyObject(string nameObj)
{
   int sub_window = 0;
   bool res = false;
   
   sub_window = ObjectFind(ChartID(), nameObj);
   
   if(sub_window >= 0)
   {
      res = ObjectDelete(ChartID(), nameObj);
      if(!res) Print("Ошибка удаления объекта: " + nameObj);
   }
}


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
      ShowProperties();
      return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      DestroyPanel();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      ShowProperties();
  }
//+------------------------------------------------------------------+
